//
//  ToggleStateIntent.swift
//  memoWidgetExtension
//
//  Created by DaleGuo on 2023/10/18.
//

import AppIntents
import CoreData
import SwiftUI
import WidgetKit

struct ToggleStateIntent: AppIntent {
    static var title: LocalizedStringResource = "Toggle todo"
    
    /// 在这里定义参数，这些参数可以通过widget传递
    @Parameter(title: "Todo ID")
    var id: String
    
    init() {}
    
    init(id: String) {
        self.id = id
    }
    
    // 如果采用 AppIntent 协议，请将自定义应用程序意图添加到 widget 扩展目标和应用程序目标。除了将其添加到 widget 扩展目标外，还将其添加到应用程序目标，这样您就可以在应用程序中重复使用添加到 widget 的按钮或切换按钮。
//    ！！！！！！！！！！！！！！！！！！！！！！！！！！！@#！@#！@#！@#！@
    
    // 我裂开。终于解决了
    
    
    @MainActor
    func perform() async throws -> some IntentResult {
//        widgetVM.toggle_todo(id: id)
        let viewContext = PersistenceController.shared.viewContext
//        print("update")
        
        let todo = getMemo().todos.first { todo in
            todo.id == id
        }!
        
//        在数据库中存储更新信息时使用 await 关键字，并在完成后返回 perform()
        
        todo.is_completed.toggle()
        
        try! viewContext.save()
        // 并没有更新时间线 所以手动更新一下
        WidgetCenter.shared.reloadTimelines(ofKind: "memoWidget")
        return .result()
    }
    
    func getMemo() -> MemoEntity {
        let viewContext = PersistenceController.shared.viewContext
        let request = NSFetchRequest<MemoEntity>(entityName: "MemoEntity")
        request.sortDescriptors = [NSSortDescriptor(keyPath: \MemoEntity.updated_date_, ascending: false), NSSortDescriptor(keyPath: \MemoEntity.title_, ascending: true)]
        
//        request.fetchLimit = 1
    
        do {
            var memos = try viewContext.fetch(request)
//                return MemoEntity(title: "Create u memo!", content: "🎉🎉🎉", updated_time: Date())
            
            memos = memos.filter { memo in
                memo.del_flag == false
            }
            
            return memos.first ?? MemoEntity(title: "Create u memo!", content: "🎉🎉🎉", updated_time: Date())
        } catch {
            print("Error fetching portfolio entity: \(error)")
        }
        
        return MemoEntity(title: "Create u memo!", content: "🎉🎉🎉", updated_time: Date())
    }
}
